package com.demo.sharding.util;

import com.demo.sharding.constant.CommonConstants;

/**
 * @Author: WuPeng
 * @Date: 2021/6/11 2:32 下午
 */
public class ShardingUtils {

    /**
     * 通过位运算获取一个数的绝对值, 位运算比较快
     * @param value 正数或负数
     */
    public static Integer getAbsoluteValue(Integer value) {
        Integer absoluteValue = 0;
        if (value != null) {
            absoluteValue = (value + (value >> 31)) ^ (value >> 31);
        }
        return absoluteValue;
    }

    /**
     * 根据取模后的值获取虚拟节点对应的物理节点
     * @param mod 取模数据
     * @return 物理节点
     */
    public static Integer getPhysicNodeByVisualNode(int mod, String virtualNodeCountRang) {
        String[] rangArr = virtualNodeCountRang.split(CommonConstants._DEFAULT_SEPARATOR_COMMA);
        Integer physicCount = null;
        for (int i = 0; i < rangArr.length; i++) {
            String[] tmpArr = rangArr[i].split("-");
            if ((mod >= Integer.parseInt(tmpArr[0])) && (mod <= Integer.parseInt(tmpArr[1]))) {
                physicCount = i;
                break;
            }
        }
        return physicCount;
    }
}
